package it.omnisong.server;

import java.io.IOException;
import java.util.ArrayList;

import org.apache.lucene.queryParser.ParseException;

import it.omnisong.client.BasicSearchService;
import it.omnisong.client.model.Song;
import it.omnisong.client.model.StockSong;
import it.omnisong.client.model.Wikilink;
import it.omnisong.server.index.LyricSearcher;
import it.omnisong.server.index.WikipediaSearcher;

import com.google.gwt.user.server.rpc.RemoteServiceServlet;

@SuppressWarnings("serial")
public class BasicSearchServiceImpl extends RemoteServiceServlet implements
BasicSearchService {
	
	public ArrayList<StockSong> basicSearch(String query) throws IllegalArgumentException {

		ArrayList<StockSong> result = null;
		LyricSearcher lyricSearcher;
		WikipediaSearcher wikiSearcher;
		try {
			result = new ArrayList<StockSong>(); // inizializzo il risultato, lista di StockSong
			
			/* inizializzo i due searcher */
			lyricSearcher = new LyricSearcher();

			/* recupero le song secondo il titolo della canzone */
			ArrayList<Song> retrievedSongs = lyricSearcher.searchSongTitle(query);

			/* per ogni canzone recupero il wikilink dell'artista */
			for(Song song : retrievedSongs) {
				wikiSearcher = new WikipediaSearcher();
				String artist = song.getArtist(); // prendo il nome dell'artista e lo uso per cercare nei wikilink
				System.out.println(artist);
				ArrayList<Wikilink> wikiLinks = wikiSearcher.searchIndex(artist); 
				if(!wikiLinks.isEmpty()) {
					Wikilink retrievedWikilink = wikiLinks.get(0); // recupero solo il primo artista trovato
					StockSong stock = new StockSong(song.getArtist(), retrievedWikilink.getUrl(), song.getTitle(), song.getLyric());
					result.add(stock);
				}
				else {
					StockSong stock = new StockSong(song.getArtist(), "", song.getTitle(), song.getLyric());
					result.add(stock);
				} 
			}
			return result; // ritorna la lista delle song recuperate, come stock per essere visualizzate nella grid
			
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//System.out.println(query);
		return(result); 
	}

}
